package com.briup.pts.service.impl;

import com.briup.pts.domain.po.AnalysisPO;
import com.briup.pts.mapper.AnalysisMapper;
import com.briup.pts.service.AnalysisService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class AnalysisServiceImpl implements AnalysisService {

    private final AnalysisMapper mapper;

    @Override
    public Map<String, List<?>> count() {
        // 从数据库中获取原始数据
        List<AnalysisPO> analysisPOS = mapper.count();
        List<String> names = new ArrayList<>();
        List<Integer> values = new ArrayList<>();
        // 遍历analysisPOS，给两个集合添加数据
        analysisPOS.forEach(analysisPO -> {
            names.add(analysisPO.getName());
            values.add(analysisPO.getValue());
        });
        // 返回数据
        return Map.of("name", names, "value", values);
    }

    @Override
    public Map<String, Integer> indexCount() {
        // 获取原始数据
        List<AnalysisPO> analysisPOS = mapper.indexCount();
        // 处理数据
        return analysisPOS.stream()
                .collect(Collectors.toMap(
                        AnalysisPO::getName,
                        AnalysisPO::getValue
                ));
    }

    @Override
    public Map<String, Integer> diseaseCount() {
        List<AnalysisPO> analysisPOS = mapper.diseaseCount();
        // 处理数据
        return analysisPOS.stream()
                .collect(Collectors.toMap(
                        AnalysisPO::getName,
                        AnalysisPO::getValue
                ));
    }

    @Override
    public Map<String, List<?>> salesCount() {
        List<AnalysisPO> analysisPOS = mapper.salesCount();
        // 创建names，用于存储12个月份的名称
        List<String> names = List.of("1月", "2月", "3月",
                "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月");
        // 创建values，用于存储12个月份对应的销售数据
        // Collections.nCopies(12,0) 返回一个长度为12，并且初始值都为0的List集合
        List<Integer> values = new ArrayList<>(Collections.nCopies(12, 0));
        // 处理数据
        for (AnalysisPO analysisPO : analysisPOS) {
            String name = analysisPO.getName();
            Integer value = analysisPO.getValue();
            // 将结果值放入到values集合中，analysisPO中的name在本销售数据中是月份，与下标之间的关系为-1
            values.set(Integer.parseInt(name)-1,value);
        }
        return Map.of("name", names, "value", values);
    }
}
